package com.tarena.rabbitmq.test;

import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import org.junit.Before;
import org.junit.Test;

import java.io.IOException;
import java.util.concurrent.TimeoutException;

/**
 * 入门案例中的生产者
 * 组织一个简单的消息 包装我们携带一个字符串数据 发送到 rabbitmq
 */
public class DemoProducer {
    private Connection connection;
    /**
     * 使用一个@Before测试框架注解 在@Test方法执行之前
     * 先构建出来一个连接对象
     */
    @Before
    public void init() throws IOException, TimeoutException {
        //创建连接工厂(有工厂类 就说明这个链接 不可能是new之后set set就搞定的)
        ConnectionFactory factory=new ConnectionFactory();
        //对连接工厂设置蓝图 如何连接 连接谁 localhost:5672 guest guest用户 访问虚拟主机 /
        factory.setHost("localhost");
        factory.setPort(5672);
        factory.setUsername("guest");
        factory.setPassword("guest");
        factory.setVirtualHost("/");
        //从工厂拿到长连接
        connection=factory.newConnection();
    }
    /**
     * 使用上面的连接对象,发送一个 hello world消息到rabbitmq
     */
    @Test
    public void sendMessage() throws IOException {
        //打桩
        System.out.println("入门案例生产者开始发送消息");
        //1.拿到连接才能发送消息 先从长连接获取一个短链接
        Channel channel = connection.createChannel();
        //2.准备即将发送的一个消息内容
        String msg="这是我的第一条消息";
        //3.将消息发送到现成的一个交换机 如果发成功了
        /*参数属性介绍
         * exchange: 就是你想要将消息发送到的交换机名称 默认有7个 (AMQP default) 名字是空字符串
         * routingKey: 消息携带的路由key,决定了消息可以被投递到哪个队列
         * props: 消息携带的属性,比如消息优先级,消息最大长度,消息最大存活时间
         * body: byte数组,消息数据的二进制流
         */
        channel.basicPublish("", "queue01", null, msg.getBytes());
        System.out.println("消息发送结束");
    }
}
